從某個class
繼承屬性
方法
等直接使用,不用另外宣告。
被繼承
的類稱為superclass
。繼承
的類稱為subclass
。下面統一會以這兩個英文作為代稱。
格式:
subclass extends superclass {}
public Person {
String name;
int age;
public String getInfo() {
return "name is = " + name + ", age is = " + age);
}
}
public Student extends Person {
String school;
}
可以從兩種方式進行繼承
的設計:
Person
接著從Person
中找到有關聯可以被繼承
的部分後,接著再定義Student
)。繼承
的部分,如耗電量、廠牌等等,再定義一個電器的類
,讓這些這些電器可以繼承
)。繼承的好處:
💡在使用繼承時可以使用"is-a"的方式去思考符不符合繼承的關係
💡不要為了為了繼承而繼承
💡例如狗和貓都很多共同的屬性,就讓貓成為狗的superclass
當superclass
的屬性
或方法
使用private
進行封裝
時,subclass
也是會一併繼承這些屬性
或方法
,但是沒有權限
使用。
superclass
可以被多個subclass``繼承
、但是一個類只能有一個superclass
,一個類繼承
另一個類以後,它還可以被其他的類繼承。
這樣是可以的:
public A {}
public B extends A {}
public C extends B {}
這樣是不可以的:
public A {}
public B {}
public C extends A , B {}
一個類只能有一個super class
,無法同時
繼承多個class,但是可以多層
的繼承。
例如:
多層
的繼承。多個
繼承。(D已經繼承A的情況下,就無法再繼承B)封裝
的權限
private
default
protected
public
中的protected
權限是公開到subClass
public Person {
String name;
int age;
protected String phone;
public String getInfo() {
return "name is = " + name + ", age is = " + age);
}
}
public Student extends Person {
String school;
}
// 假設在不同的package中
import com.person.Person
public StudentTest {
public static void main(String[] args) {
Student student1 = new Student();
student1.phone = "0912345678";
Person person = new Person();
// 無法使用
person.phone = "0998765432";
}
}
由於StudentTest
並不是Person
的subclass
,且也不在同一個package
中,所以它沒有辦法使用Person
中宣告為protected
的phone
屬性
override
指的是當subclass
將從superclass``繼承
方法中的程式碼進行重寫。
例如:
public Person {
String name;
int age;
protected String phone;
public String getInfo() {
return "name is = " + name + ", age is = " + age);
}
}
public Student extends Person {
String school;
public String getInfo() {
return "這是被重寫過的getInfo method";
}
}
若是繼承
的方法有overload
時,只要參數
的內容相同即可只重寫那一個方法,其餘的一樣會繼承
。
有幾個需要注意的部分:
superclass``方法
的權限修飾符。例如:💡這樣是錯誤的無法重寫
public Person {
String name;
int age;
protected String phone;
protected String getInfo() {
return "name is = " + name + ", age is = " + age);
}
}
public Student extends Person {
String school;
String getInfo() {
return "這是被重寫過的getInfo method";
}
}
protected
的權限相對於default(沒有寫任何權限)
的權限還大,這樣是無法重寫的。
權限由小到大:
private
(只有自身類
可以使用)→ default
(相同package
可以使用)→ protected
(繼承
的subclass
可以使用) → public
(任何類
都可以使用)
void
:必須也是void
。基本數據類型
:必須跟superclass
相同。(即便可以提昇
也不能)引用類型
:該類型必須至少是superclass
返回類型的subclass
,或與superclass
相同。基本數據類型:
public Person {
int age;
public int getAge() {
return age;
}}
public Student extends Person {
// 這樣不行
/*
public double getAge() {
return age;
}
*/
//這樣可以
public int getAge() {
age += 5
return age;
}
}
引用數據類型:
// Person class
public Person {
public Person getPerson() {
}
}
// Student class
public Student extends Person {
public Student getPerson() {
}
}
superclass
異常類型的subclass
或相同。super
指的是當繼承了superclass
的屬性
或方法
時,還是需要使用superclass
的屬性
或方法
,可以使用super
去改成調用superclass
的屬性
或方法
,但是使用super
時還是會受到權限的限制。
例如:
public Person {
String name;
int age = 20;
protected String phone;
public String getInfo() {
return "name is = " + name + ", age is = " + age);
}
}
public Student extends Person {
int age = 10;
String school;
public void printAge() {
System.out.println(age); // 10
System.out.println(super.age); // 20
}
public String getInfo() {
super.getInfo();
return "這是被重寫過的getInfo method";
}
}
當在屬性
或方法
前面加上super.
時,會直接去superclass
找符合的屬性
或方法
。
若是在構造器
中使用時,super
必須放在構造器
中的第一行(跟this
)一樣,並且this
和super
只能擇一使用。
public Person {
String name;
int age = 20;
public Person() {
}
public Person(String name, int age) {
this .name = name;
this.age = age;
}
}
public Student extends Person {
int age = 10;
String school;
public Student() {
super();
}
public Student(String name, int age) {
super(name, age);
}
}
subclass
的構造器
中,一定會有其中一個是使用super
去調用superclass
的構造器